#include "var.h"
#include "TimeEvent.h"
#include "string.h"
#include "display.h"
#include "para_config.h"
#include "ThermostatTask.h"
/* Private define ------------------------------------------------------------*/

/*********************************************************************
 * MACROS
 */

/*********************************************************************
 * TYPEDEFS
 */

/*********************************************************************
 * CONSTANTS
 */

/*********************************************************************
 * GLOBAL VARIABLES
 */

uint8_t code ver[3] = {2, 1, 5};

uint8_t xdata SetDefault;

uint16_t idata templ = 0, temph = 0;
uint8_t idata i = 0;

/******************key param****************/
keyBuff_t xdata KeyBuff, KeyChangedBuff, FlagKeyPress, FlagKeyRelease, LastTimeKey;
uint8_t xdata LongKeyEvt = 0;
uint8_t xdata keyCount = 0;
uint8_t xdata FF_PressCount = 0, FF_ReleaseCount = 0;
uint8_t xdata PressPageType;
uint16_t xdata LongPressTime;
keyState_t xdata KeyStatus;
uint8_t xdata status = 0x0F, KeyNum = 0;

/******************led param****************/
uint8_t xdata hundreds = 0, decade = 0, unit = 0, decimals = 0;
uint8_t xdata hi=0, lo=0;
uint16_t xdata tempA = 0;

uint8_t code NumCode[10] = {Num_0, Num_1, Num_2, Num_3, Num_4, Num_5, Num_6, Num_7, Num_8, Num_9}; // Code_A, Code_b, Code_C, Code_d, Code_E, Code_F}; // 0-9 abcde
#ifdef FAN_PWM
uint16_t code CfgList[CfglistNum] = {0x7306, 0x6D78, 0x5006, 0x505B, 0x504F, 0x5066, 0x393F, 0x3906, 0x395B, 0x394F, 0x3966, 0x396D, 0x397D, 0x3907, 0x5E3F, 0x5E06, 0x5E5B, 0x5E4F, 0x5E66, 0x5E58, 0x5E78, 0x5E5E, 0x6771, 0x6778, 0x7106, 0x715B, 0x714F, 0x7776, 0x7738, 0x775E, 0x776D, 0x5E73, 0x6767};
//						                 P1      St      r1      r2      r3      r4      C0      C1      C2      C3      C4      C5      C6      C7      d0      d1      d2      d3      d4      dc      dt      dd      qf      qt      F1      F2      F3      AH      AL      Ad      AS      dP      ff
#else
uint16_t code CfgList[CfglistNum] = {0x7306, 0x6D78, 0x5006, 0x505B, 0x504F, 0x5066, 0x393F, 0x3906, 0x395B, 0x394F, 0x3966, 0x396D, 0x397D, 0x3907, 0x5E3F, 0x5E06, 0x5E5B, 0x5E4F, 0x5E66, 0x5E58, 0x5E78, 0x5E5E, 0x6771, 0x6778, 0x7106, 0x715B, 0x714F, 0x7776, 0x7738, 0x775E, 0x776D, 0x5E73};
//						                 P1      St      r1      r2      r3      r4      C0      C1      C2      C3      C4      C5      C6      C7      d0      d1      d2      d3      d4      dc      dt      dd      qf      qt      F1      F2      F3      AH        AL     Ad      AS      dP
#endif
uint8_t xdata displayCode[4];

uint8_t xdata updateCount = 0;
uint8_t xdata displayState = 0;

uint16_t xdata ErrCodeList[ErrCodelistNum];
uint8_t xdata ErrPage = 0, e = 0, ErrPageMax = 0;

/******************cfg param****************/
quickFrozenState_t idata QuickFrozenState = q_Idle;
cfgParaRange_t code CfgParaRange[CfglistNum] =
	{
		{0, 0, 0, 0, 99},	// P1 密码
		{1, 0, 0, -50, 10}, // St  设定温度
		{1, 0, 0, -50, 10}, // r1  设定温度最小值
		{1, 0, 0, -50, 10}, // r2  设定温度最大值
		{0, 1, 0, 1, 100},	// r3  温度上回差   DP
		{0, 1, 0, 0, 100},	// r4  温度下回差   DP

		{1, 1, 0, -120, 120}, // C0 柜内传感器补偿
		{1, 1, 0, -120, 120}, // C1 化霜传感器补偿
		{0, 0, 0, 30, 120},	  // C2  上电强制开机时间  min
		{0, 0, 0, 0, 99},	  // C3  压缩机最小停机时间 min
		{0, 0, 0, 0, 99},	  // C4  压缩机最大开机时间 hour
		{0, 0, 0, 1, 99},	  // C5  压缩机首次最长开机时间 hour
		{0, 0, 0, 0, 99},	  // C6  传感器故障时压缩机工作时间 min
		{0, 0, 0, 1, 99},	  // C7  传感器故障时压缩机停机时间 min

		{0, 0, 0, 0, 1},  // d0  除霜类型（0:自然化霜，1：电加热化霜）
		{0, 0, 0, 0, 60}, // d1  除霜启动后延迟输出时间
		{0, 0, 0, 0, 2},  // d2  除霜显示
		{1, 0, 0, 0, 50}, // d3  除霜终止温度
		{0, 0, 0, 0, 99}, // d4  除霜后高温报警屏蔽时间
		{0, 0, 0, 0, 99}, // dc  除霜周期
		{0, 0, 0, 1, 99}, // dt  除霜最长时间
		{0, 0, 0, 0, 15}, // dd  滴水时间

		{0, 0, 0, 1, 99}, // qf 速冻时间
		{0, 0, 0, 0, 10}, // qt 速冻偏差温度

		{0, 0, 0, 0, 1},  // F1 风机运行模式
		{0, 0, 0, 0, 60}, // F2 风机滞后压缩机启动延时
		{0, 0, 0, 0, 60}, // F3 风机滞后压缩机关闭延时

		{0, 0, 0, 0, 50},  // AH  高温报警温差
		{0, 0, 0, 0, 50},  // AL  低温报警温差
		{0, 0, 0, 0, 99},  // Ad  报警延时
		{0, 0, 0, 0, 120}, // AS  上电报警延时
#ifdef FAN_PWM
		{0, 0, 0, 0, 1}, // DP  面板显示模式
		{0, 0, 0, 0, 2}	 // fp  风机等级
#else
		{0, 0, 0, 0, 1} // DP  面板显示模式
#endif
};

cfgParaRange_t xdata st_ParaRange[3] =
	{
		{1, 0, 0, -50, 10}, // St  设定温度
		{1, 0, 0, -50, 10}, // r1  设定温度最小值
		{1, 0, 0, -50, 10}	// r2  设定温度最大值
};

#ifdef FAN_PWM
uint16_t xdata FanPwmList[3] = {14500, 16000, 18450};
#endif

uint8_t xdata CoolingMode = 0, L_CoolingMode; // 0:冷冻模式  1：冷藏模式
cfgPara_t xdata cfgPara[2];
cfgPara_t xdata DuplicatePara;
int8_t xdata *cfg_Ptr = NULL;
int8_t xdata *duplicate_sptr = NULL;
int8_t xdata DuplicateData = 0; // 备用数据

tPara_t idata tPara;

int16_t xdata CtrTargetTemp;
int16_t xdata CtrTargetTemp1;
int16_t xdata CtrTargetTemp2;

/********************NTC0******************/
ntcPara_t xdata ntcPara[2];
uint16_t xdata NTC_ADValue;
int32_t xdata NTC_ADValue_Sum;

int16_t xdata TempInside = 0;
int16_t xdata DiffTemp = 0;
int16_t xdata DisplayTemp = 0;
int16_t xdata TargetTemp = 0;
uint16_t xdata offsetTemp = 0;
int16_t xdata BeforeDefrosteTemp = 0;

/********************NTC1******************/
int16_t idata DefrostTemp = 0;
errState_t xdata ErrorState;

flag_t xdata Flag1;
flag2_t xdata Flag2;
flag3_t xdata Flag3;

displayDot_t xdata disDotStatus;
// workState_t xdata CompWorkState = Stopping;
defrostState_t xdata DefrostState = defrostingCycle;

tpage_MSG xdata m_PageInfor = {0, 0, 0};

uint8_t idata Evt_tick = 0;
uint8_t idata evt_index = 0;

uint32_t xdata CompRunMaxTime = 0;
uint32_t idata FactoryMode_StopTime = 0;

/*********************************************************************
 * @fn     void Variable_Init( void )
 *
 * @brief  变量初始化
 *
 * @param
 *
 * @return  none
 */
void Variable_Init(void)
{
	TM1650_SystemCmd(0x10, 0x00, 0x00, 0x01);
	displayCode[3] = 0xFF;
	displayCode[2] = 0xFF;
	displayCode[1] = 0xFF;
	displayCode[0] = 0xFF;
	DisplayAllSymbol(displayCode);

	KeyNum = 0xFF;
	KeyBuff.allBits = 0xFF;
	KeyChangedBuff.allBits = 0;
	LastTimeKey.allBits = 0xFF;
	FlagKeyPress.allBits = 0;
	FlagKeyRelease.allBits = 0;
	LongKeyEvt = 0;

	Flag1.allBits = 0;
	Flag2.allBits = 0;
	Flag3.allBits = 0;

	Flag2.OneBit.Lock = 1;

	Flag2.OneBit.CompFirstRun = 1;
	Flag2.OneBit.CompFirstRunStart = 1;

	DefrostState = defrostingCycle;
	m_PageInfor.m_Type = 0;
	m_PageInfor.m_HomePg = 0;
	m_PageInfor.m_CfgPg = 0;

	CoolingMode = 0;
	L_CoolingMode = 0;
	DuplicateData = 0;
	/****************冷冻参数****************/
	cfgPara[0].password = DEF_PW;
	cfgPara[0].St = DEF_St;					   // St  设定温度
	cfgPara[0].StMin = DEF_r1;				   // r1  设定温度最小值
	cfgPara[0].StMax = DEF_r2;				   // r2  设定温度最大值
	cfgPara[0].rd1 = DEF_r3;				   // r3  温度上回差   DP
	cfgPara[0].rd2 = DEF_r4;				   // r4  温度下回差   DP
	cfgPara[0].C0 = DEF_C0;					   // C0 控温传感器温度补偿
	cfgPara[0].C1 = DEF_C1;					   // C1 化霜传感器温度补偿 DP
	cfgPara[0].FactoryTestTime = DEF_C2;	   // C2  上电强制开机时间
	cfgPara[0].CompDownTimeMin = DEF_C3;	   // C3  压缩机最小停机时间
	cfgPara[0].CompRunTimeMax = DEF_C4;		   // C4  压缩机最大开机时间
	cfgPara[0].CompFirstRunTimeMax = DEF_C5;   // C5  压缩机首次最大开机时间
	cfgPara[0].sensorErrCompRunTime = DEF_C6;  // C6  传感器故障时压缩机工作时间
	cfgPara[0].sensorErrCompStopTime = DEF_C7; // C7  传感器故障时压缩机停机时间
	cfgPara[0].defrosteType = DEF_d0;		   // d0  除霜类型（0:自然化霜，1：电加热化霜）
	cfgPara[0].defrosteDelayTime = DEF_d1;	   // d1  除霜启动后延迟输出时间
	cfgPara[0].defrosteShowMode = DEF_d2;	   // d2  除霜显示
	cfgPara[0].defrosteEndTemp = DEF_d3;	   // d3  除霜终止温度
	cfgPara[0].d8 = DEF_d4;					   // d4  除霜后高温报警屏蔽时间
	cfgPara[0].defrosteCycleTime = DEF_dc;	   // dc  除霜周期
	cfgPara[0].defrosteTime = DEF_dt;		   // dt  除霜最长时间
	cfgPara[0].defrosteDripTime = DEF_dd;	   // dd  滴水时间
	cfgPara[0].quickFrozenTime = DEF_qf;	   // 速冻时间 qf
	cfgPara[0].quickFrozenTemp = DEF_qt;	   // 速冻回差温度
	cfgPara[0].fanMode = DEF_F1;			   // F1风机运行模式
	cfgPara[0].fanDelayTime1 = DEF_F2;		   // F2 通电后风机首次启动延时
	cfgPara[0].fanDelayTime2 = DEF_F3;		   // F3 除霜后风机启动延时
	cfgPara[0].AH = DEF_AH;					   // AH  高温报警温差
	cfgPara[0].AL = DEF_AL;					   // AL  低温报警温差
	cfgPara[0].Ad = DEF_Ad;					   // Ad  报警延时
	cfgPara[0].AS = DEF_AS;					   // AS  上电报警延时
	cfgPara[0].DP = DEF_DP;					   // DP  面板显示模式
	cfgPara[0].fanpwm = 2;
	/****************冷藏参数****************/
	cfgPara[1].password = DEF2_PW;
	cfgPara[1].St = DEF2_St;					// St  设定温度
	cfgPara[1].StMin = DEF2_r1;					// r1  设定温度最小值
	cfgPara[1].StMax = DEF2_r2;					// r2  设定温度最大值
	cfgPara[1].rd1 = DEF2_r3;					// r3  温度上回差   DP
	cfgPara[1].rd2 = DEF2_r4;					// r4  温度下回差   DP
	cfgPara[1].C0 = DEF2_C0;					// C0 控温传感器温度补偿
	cfgPara[1].C1 = DEF2_C1;					// C1 化霜传感器温度补偿 DP
	cfgPara[1].FactoryTestTime = DEF2_C2;		// C2  上电强制开机时间
	cfgPara[1].CompDownTimeMin = DEF2_C3;		// C3  压缩机最小停机时间
	cfgPara[1].CompRunTimeMax = DEF2_C4;		// C4  压缩机最大开机时间
	cfgPara[1].CompFirstRunTimeMax = DEF2_C5;	// C5  压缩机首次最大开机时间
	cfgPara[1].sensorErrCompRunTime = DEF2_C6;	// C6  传感器故障时压缩机工作时间
	cfgPara[1].sensorErrCompStopTime = DEF2_C7; // C7  传感器故障时压缩机停机时间
	cfgPara[1].defrosteType = DEF2_d0;			// d0  除霜类型（0:自然化霜，1：电加热化霜）
	cfgPara[1].defrosteDelayTime = DEF2_d1;		// d1  除霜启动后延迟输出时间
	cfgPara[1].defrosteShowMode = DEF2_d2;		// d2  除霜显示
	cfgPara[1].defrosteEndTemp = DEF2_d3;		// d3  除霜终止温度
	cfgPara[1].d8 = DEF2_d4;					// d4  除霜后高温报警屏蔽时间
	cfgPara[1].defrosteCycleTime = DEF2_dc;		// dc  除霜周期
	cfgPara[1].defrosteTime = DEF2_dt;			// dt  除霜最长时间
	cfgPara[1].defrosteDripTime = DEF2_dd;		// dd  滴水时间
	cfgPara[1].quickFrozenTime = DEF2_qf;		// 速冻时间 qf
	cfgPara[1].quickFrozenTemp = DEF2_qt;		// 速冻回差温度
	cfgPara[1].fanMode = DEF2_F1;				// F1风机运行模式
	cfgPara[1].fanDelayTime1 = DEF2_F2;			// F2 通电后风机首次启动延时
	cfgPara[1].fanDelayTime2 = DEF2_F3;			// F3 除霜后风机启动延时
	cfgPara[1].AH = DEF2_AH;					// AH  高温报警温差
	cfgPara[1].AL = DEF2_AL;					// AL  低温报警温差
	cfgPara[1].Ad = DEF2_Ad;					// Ad  报警延时
	cfgPara[1].AS = DEF2_AS;					// AS  上电报警延时
	cfgPara[1].DP = DEF2_DP;					// DP  面板显示模式
	cfgPara[1].fanpwm = 2;

	St_ParasRangeUpate_Evt(CoolingMode);

	cfg_Ptr = (int8_t *)&cfgPara[CoolingMode].password;
	duplicate_sptr = (int8_t *)&DuplicatePara.password;

	ErrorState.allBits = 0;
	ErrPage = 0;

	memset((uint8_t *)&m_PageInfor, 0x00, sizeof(tpage_MSG));
	memset((uint8_t *)&tPara, 0x00, sizeof(tPara_t));
	memset((uint8_t *)timer_10msDB, 0x00, TimeEventSize * sizeof(Event_Timer));
	memset((uint8_t *)ntcPara, 0x00, 2 * sizeof(ntcPara_t));

	disDotStatus.allBits = 0;
}
